//
//  ENTBoostKit.h
//  ENTBoostKit
//
//  Created by zhong zf on 14-7-22.
//
//

#import "ENTBoostClient.h"
#import "EBMessage.h"

@protocol ENTBoostKitDelegate <ENTBoostClientOuterDelegate>
@optional
/**接收到聊天消息
 * @param message 消息
 */
- (void)onRecevieMessage:(EBMessage*)message;

/**自动登录状况回调事件
 * @param state 登录结果状态 YES=成功, NO=失败
 * @param accountInfo 用户信息，当state=YES有效
 * @param error 错误信息，当state=NO有效
 */
- (void)onAutoLogonEvent:(BOOL)state accountInfo:(EBAccountInfo*)accountInfo error:(NSError*)error;

@end


@class EBContactInfo;

@interface ENTBoostKit : NSObject <ENTBoostClientInnerDelegate>

/**设置服务器访问地址,在首次获取[ENTBoostKit sharedToolKit]实例"前"设置才有效，默认访问官方测试服务entboost.entboost.com:18012
 * @param serverAddress 服务器访问地址，格式如：192.168.0.1:18012
 */
+ (void)setServerAddress:(NSString*)serverAddress;

//获取当前服务器访问地址
+ (NSString*)serverAddress;

//获取全局单例
+ (ENTBoostKit*)sharedToolKit;

/**注册应用环境
 * @param appId 应用ID
 * @param appKey 应用key
 * @param delegate SDK事件回调代理
 * @param completionBlock 成功后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)registerWithAppId:(NSString*)appId appKey:(NSString*)appKey andDelegate:(id)delegate onCompletion:(void(^)(void))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**用户登录(同步调用方式)
 * @param account 用户账号
 * @param password 用户密码
 * @param completionBlock 成功后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)logonSyncWithAccount:(NSString*)account password:(NSString*)password onCompletion:(void(^)(EBAccountInfo *accountInfo))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**用户自动登录(同步调用方式)
 * 只要用户在当前终端曾经成功登录过，就可以尝试使用
 * @param account 用户账号
 * @param completionBlock 成功后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)autoLogonWithAccount:(NSString*)account onCompletion:(void(^)(EBAccountInfo *accountInfo))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

///用户登出
- (void)asyncLogoff;

/**是否尝试自动登录
 * 依据该终端上次用户登录情况，尝试自动登录
 */
@property(nonatomic) BOOL wantAutoLogon;

/**邀请对方用户进行一对一会话
 * 邀请过程中，如果持续时间较长，将执行回调事件onCallAlerting:
 * 如果邀请成功后将执行回调事件onCallConnected:
 * 如果失败后将执行回调事件onCallReject:或者onCallBusy:
 * @param account 用户账号
 * @param failureBlock 失败后的回调函数
 */
- (void)callUserWithAccount:(NSString*)account onFailure:(void(^)(NSError *error))failureBlock;

/**邀请对方用户进行一对一会话
 * 邀请过程中，如果持续时间较长，将执行回调事件onCallAlerting:
 * 如果邀请成功后将执行回调事件onCallConnected:
 * 如果失败后将执行回调事件onCallReject:或者onCallBusy:
 * @param depCode 企业部门或群组编号
 * @param failureBlock 失败后的回调函数
 */
- (void)callGroupWithDepCode:(uint64_t)depCode onFailure:(void(^)(NSError *error))failureBlock;

/**回复会话邀请, 用于收到onCallIncoming:事件时回复对方
 * @param callId 会话编号
 * @param accept 是否接受通话, TRUE=接受, FALSE=拒绝
 * @param completionBlock 成功后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)ackTheCall:(uint64_t)callId accept:(BOOL)accept onCompletion:(void(^)(void))completionBlock failure:(void(^)(NSError* error))failureBlock;

/**挂断会话
 * @param callId 会话编号
 * @param completionBlock 成功后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)closeTheCall:(uint64_t)callId onCompletion:(void(^)(void))completionBlock failure:(void(^)(NSError* error))failureBlock;

/**发送文本消息
 * @param text 文本内容
 * @param callId 会话编号
 * @param beginBlock 开始发送时调用的block
 * @param completionBlock 发送成功后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)sendText:(NSString*)text forCallId:(uint64_t)callId onBegin:(void(^)(uint64_t msgId))beginBlock onCompletion:(void(^)(uint64_t msgId))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**发送富文本消息
 * @param message 消息
 * @param callId 会话编号
 * @param beginBlock 开始发送时调用的block
 * @param completionBlock 发送成功后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)sendMessage:(EBMessage*)message forCallId:(uint64_t)callId onBegin:(void(^)(uint64_t msgId))beginBlock onCompletion:(void(^)(uint64_t msgId))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**发送文件
 * @param path 文件路径
 * @param callId 会话编号
 * @param offFile 是否发送离线文件
 * @param beginBlock 开始发送时调用的block
 * @param processingBlock 发送过程中不定期调用的block，用于表现发送进度
 * @param completionBlock 发送成功后调用的block
 * @param cancelBlock     发送被拒绝或取消后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)sendFileAtPath:(NSString*)path forCallId:(uint64_t)callId offFile:(BOOL)offFile onBegin:(void(^)(uint64_t msgId))beginBlock onProcessing:(void(^)(double_t percent, uint64_t callId, uint64_t msgId))processingBlock onCompletion:(void(^)(void))completionBlock onCancel:(void(^)(BOOL initiative))cancelBlock onFailure:(void(^)(NSError *error))failureBlock;

/**取消发送文件
 * @param msgId 消息编号
 * @param callId 会话编号
 * @param completionBlock 发送成功后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)cancelSendingFileWithMsgId:(uint64_t)msgId forCallId:(uint64_t)callId onCompletion:(void(^)(void))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**新增或编辑联系人,如contactInfo.contact已经存在，则是编辑操作；如contactInfo.contact不存在，则是新增操作
 * @param contactInfo 联系人信息
 * @param completionBlock 发送成功后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)saveOrUpdateContactInfo:(EBContactInfo*)contactInfo completion:(void (^)(void))completionBlock failure:(void (^)(NSError *error))failureBlock;

/**新增或编辑联系人
 * @param contact 联系人账号
 * @param completionBlock 发送成功后调用的block
 * @param failureBlock    发送失败后调用的block
 */
- (void)delContact:(NSString*)contact completion:(void (^)(void))completionBlock failure:(void (^)(NSError *error))failureBlock;

/**查询用户账号
 * @param uid 用户编号
 * @param completionBlock 发送成功后调用的block
 *          回调参数 account 用户账号
 * @param failureBlock    发送失败后调用的block
 */
- (void)queryAccountWithUid:(uint64_t)uid onCompletion:(void(^)(NSString* account))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**查询用户编号
 * @param account 用户账号
 * @param completionBlock 发送成功后调用的block
 *          回调参数 uid 用户编号
 * @param failureBlock    发送失败后调用的block
 */
- (void)queryUidWithAccount:(NSString*)account onCompletion:(void(^)(uint64_t uid))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**获取会话信息
 * @param callId 会话编号
 * @return 会话信息
 */
- (EBCallInfo*)callInfoWithCallId:(uint64_t)callId;

/**获取会话信息
 * @param uid 用户编号, 0表示忽略本查询条件; 寻找一对一会话时不可以为0
 * @param depCode 群组编号, 等于0表示寻找一对一会话, 大于0表示寻找群组会话
 * @return 会话信息
 */
- (EBCallInfo*)callInfoWithUid:(uint64_t)uid depCode:(uint64_t)depCode;

/**获取会话信息
 * @param account 用户账号, nil表示忽略本查询条件; 寻找一对一会话时不可以为nil
 * @param depCode 群组编号, 等于0表示寻找一对一会话, 大于0表示寻找群组会话
 * @return 会话信息
 */
- (EBCallInfo*)callInfoWithAccount:(NSString*)account depCode:(uint64_t)depCode;

///当前登录用户信息
- (EBAccountInfo*)accountInfo;

/**获取登录记录中的用户账号列表
 * @param ascending 是否升序排列
 * @return {NSString} 用户账号实例数组
 */
- (NSArray*)accountsOfLogonListAscending:(BOOL)ascending;

///当前企业信息
- (EBEnterpriseInfo*)enterpriseInfo;

///企业部门信息字典, {key = depCode的NSNumber对象, obj = EBGroupInfo对象}
- (NSDictionary*)entGroupInfos;

///个人群组(非企业部门)信息字典, {key = depCode的NSNumber对象, obj = EBGroupInfo对象}
- (NSDictionary*)personalGroupInfos;

/**获取部门或群组信息
 * @param depCode 部门或群组编号
 */
- (EBGroupInfo*)groupInfoWithDepCode:(uint64_t)depCode;

/**加载某部门或群组下成员信息
 * @param depCode 部门或群组编号
 * @param completionBlock 加载完成后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)loadMemberInfosWithDepCode:(uint64_t)depCode onCompletion:(void(^)(NSArray *memberInfos))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/////企业部门或个人群组中成员信息字典, {key = empCode的NSNumber对象, obj = EBMemberInfo对象}
//- (NSDictionary*)memberInfos;

//联系人信息, {key = contact, obj = EBContactInfo对象}
- (NSDictionary*)contactInfos;

///表情资源, EBEmotion实例
- (NSArray*)expressions;
///头像资源, EBEmotion实例
- (NSArray*)headPhotos;
///表情和头像资源是否已加载完毕
- (BOOL)isEmotionLoaded;

//获取所有对话归类
- (NSArray*)talks;

/**获取某个部门或群组对话归类
 * @param depCode 部门或群组编号
 */
- (EBTalk*)talkWithDepCode:(uint64_t)depCode;

/**获取某个一对一对话归类
 * @param uid 对方用户编号
 */
- (EBTalk*)talkWithUid:(uint64_t)uid;

/**获取某个一对一对话归类
 * @param account 对方用户账号
 */
- (EBTalk*)talkWithAccount:(NSString*)account;

/**获取某个对话归类
 * @param talkId 对话归类编号
 */
- (EBTalk*)talkWithTalkId:(NSString*)talkId;

/**新增或更新对话归类，只适用于群组会话
 * @param depCode 部门或群组编号
 * @param completionBlock 成功后调用的block
 * @param failureBlock    失败后调用的block
 */
- (void)insertOrUpdateTalkWithDepCode:(uint64_t)depCode onCompletion:(void(^)(EBTalk* talk))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**新增或更新对话归类，只适用于一对一会话
 * otherUid与otherAccount至少二填一
 * @param otherUid 对方用户编号
 * @param otherAccount 对方用户账号
 * @param otherUserName 对话用户名
 * @param completionBlock 成功后调用的block
 * @param failureBlock    失败后调用的block
 */
- (void)insertOrUpdateTalkWithUid:(uint64_t)uid otherAccount:(NSString*)otherAccount otherUserName:(NSString*)otherUserName onCompletion:(void(^)(EBTalk* talk))completionBlock onFailure:(void(^)(NSError *error))failureBlock;

/**获取聊天记录数量
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限，填nil表示无下限
 * @param endTime 聊天记录发生时间范围上限，填nil表示无上限
 */
- (NSUInteger)countOfMessagesWithTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime;

/**获取多条聊天记录
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限，填nil表示无下限
 * @param endTime 聊天记录发生时间范围上限，填nil表示无上限
 * @param perPageSize 每分页数量
 * @param currentPage 当前页(从1开始)
 * @param orderByTimeAscending 按聊天记录发生时间排序模式；YES=升序，NO=降序
 */
- (NSArray*)messagesWithTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime perPageSize:(NSUInteger)perPageSize currentPage:(NSUInteger)currentPage orderByTimeAscending:(BOOL)orderByTimeAscending;

/**获取多条聊天记录
 * 通过messageId定位，返回该位置前面或后面的多条记录
 * 返回的聊天记录与指定的messageId都属于同一个TalkId
 * @param messageId 消息编号，用于定位记录位置
 * @param orderByTimeAscending 是否按聊天记录发生时间升序进行排序；NO=降序排序(回头查询)，YES=升序排序
 * @param perPageSize 结果集最大返回数量
 * @return EBMessage实例数组
 */
- (NSArray*)messagesFromLastMessageId:(uint64_t)messageId orderByTimeAscending:(BOOL)orderByTimeAscending perPageSize:(NSUInteger)perPageSize;

/**获取多条聊天记录
 * @param messageIds 消息编号数组, NSNumber实例
 * @return EBMessage实例数组
 */
- (NSArray*)messagesWithMessageIds:(NSArray*)messageIds;

/**获取聊天记录
 * @param messageId 消息编号
 */
- (EBMessage*)messageWithMessageId:(uint64_t)messageId;

/**删除单个聊天记录
 * @param messageId 消息编号
 */
- (void)deleteMessageWithMessageId:(uint64_t)messageId;

/**删除多个聊天记录
 * @param messageId 消息编号
 */
- (void)deleteMessageWithMessageIds:(NSArray*)messageIds;

/**删除多个聊天记录
 * @param messageId 消息编号
 */
- (void)deleteMessagesWithTalkId:(NSString*)talkId;

///查询未读聊天记录的总数量
- (NSUInteger)countOfUnreadMessages;

/**查询未读聊天记录的数量
 * @param talkId 对话归类编号
 */
- (NSUInteger)countOfUnreadMessagesWithTBTalkId:(NSString*)talkId;

/**标记单个聊天记录已读状态
 * @param messageId 消息编号
 */
- (void)markMessageAsReadedWithMessageId:(uint64_t)messageId;

/**标记多个聊天记录为已读状态
 * @param talkId 对话归类编号
 */
- (void)markMessagesAsReadedWithTBTalkId:(NSString*)talkId;

@end
